# generate_sinusoids.py
import numpy as np

"""
生成一组正弦函数的特征。
函数接受两个参数：dataset是一个数据集，sinusoid_degree是正弦函数的阶数。
"""


# 定义了一个名为generate_sinusoids的函数，
# 该函数接受两个参数：dataset（数据集）和sinusoid_degree（正弦函数的最高次数）
def generate_sinusoids(dataset, sinusoid_degree):
    # 获取数据集的总行数,即数据的示例数。
    num_examples = dataset.shape[0]
    """
    创建了一个空的numpy数组sinusoids，其形状为(num_examples, 0)。
    这意味着sinusoids是一个二维数组，其中行数为num_examples，列数为0。
    由于列数为0，表示该数组没有任何列。
    这样创建一个空的数组通常是为了在后续的代码中动态地向数组中添加列。
    通过这种方式，可以根据需要逐步构建数组，而无需提前知道数组的最终大小。
    """
    # 创建一个形状为(num_examples, 0)的空数组sinusoids，用于存储生成的正弦函数特征
    sinusoids = np.empty((num_examples, 0))

    for degree in range(1, sinusoid_degree + 1):
        """
        通过一个循环，从1到sinusoid_degree遍历每个阶数。
        在每个阶数下，函数将输入数据集dataset与当前阶数相乘，并对结果应用正弦函数。
        生成的正弦函数特征被连接到sinusoids数组中
        """
        # 将每个数据示例乘以degree后计算其正弦值，
        # 得到一个形状与数据集相同的正弦函数特征数组sinusoid_features。
        sinusoid_features = np.sin(degree * dataset)
        """
        将两个数组按列连接起来，生成一个新的数组。
        具体来说，sinusoids和sinusoid_features是两个数组，
        通过np.concatenate函数将它们按列连接起来，生成一个新的数组
        """
        # 将sinusoid_features按列连接到sinusoids数组中，实现特征的累加。
        sinusoids = np.concatenate((sinusoids, sinusoid_features), axis=1)

    # 返回生成的正弦函数特征数组sinusoids
    return sinusoids